**ppp** (*Paul's PPP Package*) — пакет с открытым исходным кодом, который реализует [протокол соединения точка-точка](https://en.wikipedia.org/wiki/ru:PPP_(%D1%81%D0%B5%D1%82%D0%B5%D0%B2%D0%BE%D0%B9_%D0%BF%D1%80%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%BB) (PPP) для систем Linux и Solaris. Пакет предоставляет демон *pppd*, который может быть использован вместе с [xl2tpd](https://www.archlinux.org/packages/?name=xl2tpd), [pptpd](https://www.archlinux.org/packages/?name=pptpd) и [netctl](/index.php/Netctl_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9) "Netctl (Русский)").

Протоколы [3G](https://en.wikipedia.org/wiki/ru:3G "wikipedia:ru:3G"), [L2TP](https://en.wikipedia.org/wiki/ru:L2TP "wikipedia:ru:L2TP") и [PPPoE](https://en.wikipedia.org/wiki/ru:PPPoE "wikipedia:ru:PPPoE") работают на основе PPP, поэтому они также могут контролироваться ppp.

## Contents

*   [1 Установка](#.D0.A3.D1.81.D1.82.D0.B0.D0.BD.D0.BE.D0.B2.D0.BA.D0.B0)
*   [2 Настройка](#.D0.9D.D0.B0.D1.81.D1.82.D1.80.D0.BE.D0.B9.D0.BA.D0.B0)
    *   [2.1 PPPoE](#PPPoE)
    *   [2.2 Запуск pppd при старте системы](#.D0.97.D0.B0.D0.BF.D1.83.D1.81.D0.BA_pppd_.D0.BF.D1.80.D0.B8_.D1.81.D1.82.D0.B0.D1.80.D1.82.D0.B5_.D1.81.D0.B8.D1.81.D1.82.D0.B5.D0.BC.D1.8B)
*   [3 Дополнительно](#.D0.94.D0.BE.D0.BF.D0.BE.D0.BB.D0.BD.D0.B8.D1.82.D0.B5.D0.BB.D1.8C.D0.BD.D0.BE)
    *   [3.1 Автодозвон](#.D0.90.D0.B2.D1.82.D0.BE.D0.B4.D0.BE.D0.B7.D0.B2.D0.BE.D0.BD)
    *   [3.2 Автоматический разрыв соединения](#.D0.90.D0.B2.D1.82.D0.BE.D0.BC.D0.B0.D1.82.D0.B8.D1.87.D0.B5.D1.81.D0.BA.D0.B8.D0.B9_.D1.80.D0.B0.D0.B7.D1.80.D1.8B.D0.B2_.D1.81.D0.BE.D0.B5.D0.B4.D0.B8.D0.BD.D0.B5.D0.BD.D0.B8.D1.8F)
        *   [3.2.1 Используя cron](#.D0.98.D1.81.D0.BF.D0.BE.D0.BB.D1.8C.D0.B7.D1.83.D1.8F_cron)
        *   [3.2.2 Используя таймер systemd](#.D0.98.D1.81.D0.BF.D0.BE.D0.BB.D1.8C.D0.B7.D1.83.D1.8F_.D1.82.D0.B0.D0.B9.D0.BC.D0.B5.D1.80_systemd)
*   [4 Решение проблем](#.D0.A0.D0.B5.D1.88.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BF.D1.80.D0.BE.D0.B1.D0.BB.D0.B5.D0.BC)
    *   [4.1 Маршрут по умолчанию](#.D0.9C.D0.B0.D1.80.D1.88.D1.80.D1.83.D1.82_.D0.BF.D0.BE_.D1.83.D0.BC.D0.BE.D0.BB.D1.87.D0.B0.D0.BD.D0.B8.D1.8E)
    *   [4.2 Маскарадинг работает, но некоторые сайты не открываются](#.D0.9C.D0.B0.D1.81.D0.BA.D0.B0.D1.80.D0.B0.D0.B4.D0.B8.D0.BD.D0.B3_.D1.80.D0.B0.D0.B1.D0.BE.D1.82.D0.B0.D0.B5.D1.82.2C_.D0.BD.D0.BE_.D0.BD.D0.B5.D0.BA.D0.BE.D1.82.D0.BE.D1.80.D1.8B.D0.B5_.D1.81.D0.B0.D0.B9.D1.82.D1.8B_.D0.BD.D0.B5_.D0.BE.D1.82.D0.BA.D1.80.D1.8B.D0.B2.D0.B0.D1.8E.D1.82.D1.81.D1.8F)
    *   [4.3 Не удается загрузить модуль ядра ppp_generic](#.D0.9D.D0.B5_.D1.83.D0.B4.D0.B0.D0.B5.D1.82.D1.81.D1.8F_.D0.B7.D0.B0.D0.B3.D1.80.D1.83.D0.B7.D0.B8.D1.82.D1.8C_.D0.BC.D0.BE.D0.B4.D1.83.D0.BB.D1.8C_.D1.8F.D0.B4.D1.80.D0.B0_ppp_generic)

## Установка

[Установите](/index.php/%D0%A3%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%B8%D1%82%D0%B5 "Установите") пакет [ppp](https://www.archlinux.org/packages/?name=ppp), доступный в [официальных репозиториях](/index.php/Official_repositories_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9) "Official repositories (Русский)").

Убедитесь, что ядро вашей системы скомпилировано с поддержкой PPPoE (верно для стандартной сборки):

 `$ zgrep CONFIG_PPPOE /proc/config.gz`  `CONFIG_PPPOE=m` 

## Настройка

### PPPoE

Создайте файл настроек соединения:

 `/etc/ppp/peers/*имя_соединения*` 
```
plugin rp-pppoe.so
# rp_pppoe_ac 'имя концентратора доступа'
# rp_pppoe_service 'имя службы PPPoE'

# сетевой интерфейс
eth0
# ваш логин
name "*имя_пользователя*"
usepeerdns
persist
# раскомментируйте, если вам нужен автодозвон "по требованию"
#demand
#idle 180
defaultroute
hide-password
noauth
```

Если задана опция `usepeerdns`, при соединении *pppd* создаст файл `/etc/ppp/resolv.conf` с полученными адресами DNS-серверов. По умолчанию скрипт `/etc/ppp/ip-up.d/00_dns` перемещает этот файл в `/etc/resolv.conf`, чтобы система могла использовать эти DNS-серверы. Если это поведение является нежелательным (например, установлен локальный кэширующий DNS), отредактируйте `/etc/ppp/ip-up.d/00_dns.sh` под ваши нужды.

Добавьте запись с паролем соединения в `/etc/ppp/pap-secrets` или `/etc/ppp/chap-secrets`, в зависимости от типа аутентификации, используемого вашим провайдером. Если вы не уверены, можно добавить запись в оба файла, *pppd* выберет нужный самостоятельно. Запись выглядит следующим образом:

```
*имя_пользователя* * *пароль*

```

Имя пользователя должно совпадать с именем, указанным в опции `name`. Оно также используется для аутентификации, если не переопределено другим значением с помощью опции `user`.

Теперь вы можете попробовать установить соединение командой:

```
# pppd call *имя_соединения*

```

или

```
# pon *имя_соединения*

```

где *имя_соединения* — имя файла настроек, созданного в `/etc/ppp/peers`.

Чтобы убедиться, что соединение PPPoE установлено, проверьте вывод *pppd* в системном логе:

```
# journalctl -b --no-pager | grep pppd

```

При успешном соединении вы увидите что-то наподобие следующих строк:

```
Jul 09 22:42:33 localhost pppd[239]: Plugin rp-pppoe.so loaded.
Jul 09 22:42:33 localhost pppd[239]: RP-PPPoE plugin version 3.8p compiled against pppd 2.4.6
Jul 09 22:42:33 localhost network[184]: RP-PPPoE plugin version 3.8p compiled against pppd 2.4.6
Jul 09 22:42:33 localhost pppd[239]: pppd 2.4.6 started by root, uid 0
Jul 09 22:42:39 localhost pppd[239]: PPP session is 292
Jul 09 22:42:39 localhost pppd[239]: Connected to a0:f3:e4:4f:e3:b0 via interface enp4s0
Jul 09 22:42:39 localhost pppd[239]: Using interface ppp0
Jul 09 22:42:39 localhost pppd[239]: Connect: ppp0 <--> enp4s0
Jul 09 22:42:39 localhost pppd[239]: CHAP authentication succeeded: CHAP authentication success
Jul 09 22:42:39 localhost pppd[239]: CHAP authentication succeeded
Jul 09 22:42:39 localhost pppd[239]: peer from calling number A0:F3:E4:4F:E3:B0 authorized
Jul 09 22:42:39 localhost pppd[239]: Cannot determine ethernet address for proxy ARP
Jul 09 22:42:39 localhost pppd[239]: local  IP address 10.6.2.137
Jul 09 22:42:39 localhost pppd[239]: remote IP address 10.6.1.1
Jul 09 22:42:39 localhost pppd[239]: primary   DNS address 10.6.1.1
Jul 09 22:42:39 localhost pppd[239]: secondary DNS address 210.21.196.6

```

Файл настроек `/etc/ppp/peers/provider` используется по умолчанию, если при вызове *pppd* не было указано имя файла. Вместо явного указания имени файла настроек программе *pppd* вы также можете просто добавить символическую ссылку на свой файл:

```
# ln -s /etc/ppp/peers/*имя_соединения* /etc/ppp/peers/provider

```

Теперь можно устанавливать соединение одной командой

```
# pon

```

Чтобы разорвать соединение, выполните

```
# poff *имя_соединения*

```

### Запуск pppd при старте системы

Выполните следующие шаги:

*   Настройте модуль `ppp_generic` для загрузки во время запуска. Инструкции можно найти на странице [Модули ядра#Автоматическое управление модулями](/index.php/%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D0%B8_%D1%8F%D0%B4%D1%80%D0%B0#.D0.90.D0.B2.D1.82.D0.BE.D0.BC.D0.B0.D1.82.D0.B8.D1.87.D0.B5.D1.81.D0.BA.D0.BE.D0.B5_.D1.83.D0.BF.D1.80.D0.B0.D0.B2.D0.BB.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BC.D0.BE.D0.B4.D1.83.D0.BB.D1.8F.D0.BC.D0.B8 "Модули ядра").
*   [Включите](/index.php/%D0%92%D0%BA%D0%BB%D1%8E%D1%87%D0%B8%D1%82%D0%B5 "Включите") службу systemd:

```
# systemctl enable ppp@*имя_соединения*.service

```

## Дополнительно

### Автодозвон

Если *pppd* запущен, вы можете выполнить сброс соединения, отправив процессу сигнал `SIGHUP`:

```
# export PPPD_PID=$(pidof pppd)
# kill -s HUP $PPPD_PID

```

После разрыва соединение будет вновь установлено.

**Примечание:** Убедитесь, что опция `persist` включена в ваш файл конфигурации `/etc/ppp/peers/provider`. Также вы можете добавить параметр `holdoff 0` для переподключения без тайм-аута.

### Автоматический разрыв соединения

**Примечание:** Если вы не оставляете ваш компьютер работать круглосуточно, то можете смело пропустить этот шаг

Если у вас безлимитное соединение и вы поддерживаете его непрерывно, некоторые провайдеры могут сбрасывать его каждые 24 часа. Это гарантирует, что ваш динамический IP-адрес будет меняться каждые сутки. Чтобы иметь возможность подключиться извне, вы можете использовать какой-нибудь динамический DNS-сервис вместе с [inadyn](https://aur.archlinux.org/packages/inadyn/), тогда по доменному имени всегда можно будет вычислить текущий IP. Но чтобы избежать нежелательных разрывов, вы можете сами (настроив задачу для [cron](/index.php/Cron "Cron") либо создав таймер [systemd](/index.php/Systemd_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)#.D0.A2.D0.B0.D0.B9.D0.BC.D0.B5.D1.80.D1.8B "Systemd (Русский)")) выполнять сброс каждые сутки в такое время, когда никто не пользуется соединением — например, в 4 утра.

#### Используя cron

Выполните следующие шаги от имени суперпользователя.

Создайте файл скрипта (например, `pppd_redial.sh`) со следующим содержимым:

```
#!/bin/bash

message="Restarting the PPP connection @:" $(date)
pppd_id=$(pidof pppd)

kill -s HUP $pppd_id
echo $message

```

Сохраните файл и дайте ему права на выполнение.

Теперь создайте задачу для [cron](/index.php/Cron "Cron"), используя команду `crontab -e`. Если появляется ошибка, убедитесь, что установлена [переменная окружения](/index.php/Environment_variables_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9) "Environment variables (Русский)") `EDITOR`. По команде откроется редактор — добавьте в него строку, указав правильный путь до вашего скрипта перезапуска соединения:

```
0 4 * * * /bin/bash /root/pppd_redial.sh

```

Сохраните файл и убедитесь, что служба `cronie` работает. Если это не так, [включите](/index.php/%D0%92%D0%BA%D0%BB%D1%8E%D1%87%D0%B8%D1%82%D0%B5 "Включите") и [запустите](/index.php/%D0%97%D0%B0%D0%BF%D1%83%D1%81%D1%82%D0%B8%D1%82%D0%B5 "Запустите") службу `cronie`.

Теперь ваше соединение будет перезапускаться каждый день в 4 утра.

#### Используя таймер systemd

Также вы можете настроить таймер [systemd](/index.php/Systemd_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9) "Systemd (Русский)") для выполнения ежедневного перезапуска соединения. Просто создайте файлы *.service* и *.timer* с одинаковыми именами:

 `ppp-redial.timer` 
```
[Unit]
Description=Reconnect PPP connections daily

[Timer]
OnCalendar=*-*-* 05:00:00

[Install]
WantedBy=multi-user.target

```
 `ppp-redial.service` 
```
[Unit]
Description=Reconnect PPP connections

[Service]
Type=simple
ExecStart=/usr/bin/poff -r

```

Теперь просто [включите](/index.php/%D0%92%D0%BA%D0%BB%D1%8E%D1%87%D0%B8%D1%82%D0%B5 "Включите") и [запустите](/index.php/%D0%97%D0%B0%D0%BF%D1%83%D1%81%D1%82%D0%B8%D1%82%D0%B5 "Запустите") таймер, и systemd будет выполнять сброс соединения каждый день в указанное время.

## Решение проблем

### Маршрут по умолчанию

При запуске *pppd* пытается добавить свой системный маршрут по умолчанию (*default route*). Если перед запуском уже был установлен такой маршрут, *pppd* не станет его обновлять, и новые соединения во внешнюю сеть направляться не будут. При этом в `/var/log/errors.log` вы увидите что-то наподобие:

```
pppd[nnnn]: not replacing existing default route via *xxx.xxx.xxx.xxx*

```

Если это поведение нежелательно, и `xxx.xxx.xxx.xxx` — совсем не то, что вам нужно, вы можете создать простой скрипт в `/etc/ppp/ip-pre-up` с таким содержимым:

 `/etc/ppp/ip-pre-up/10-route-del-default.sh` 
```
#!/bin/sh
/usr/bin/route del default

```

Не забудьте дать скрипту права на запуск.

[Перезапустите](/index.php/%D0%9F%D0%B5%D1%80%D0%B5%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D1%82%D0%B8%D1%82%D0%B5 "Перезапустите") службу `pppd`.

### Маскарадинг работает, но некоторые сайты не открываются

Проблема выражается в том, что соединение есть, но часть сайтов и сервисов не работают, если вы используете ваш компьютер в роли маршрутизатора для других компьютеров. Дело в том, что размер MTU (*Maximum Transmission Unit* — максимальное количество байт данных в одном пакете) в PPPoE равен 1492 байтам, что меньше, чем используют большинство сайтов (1500). Ваш маршрутизатор отправляет серверу специальный пакет ICMP 3:4 (сообщение о том, что нужно переразбиение данных), запрашивая меньший MTU, но сетевые экраны многих сайтов блокируют это сообщение.

Проблема решается добавлением правила с PMTU clamping в [iptables](/index.php/Iptables "Iptables"):

```
# iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

```

Однако, по некоторой причине, это правило может не попадать в вывод *iptables-save*. Если у вас тот случай, когда *iptables-restore* не восстанавливает правило после перезапуска, попробуйте следующее решение.

Создайте файл службы [systemd](/index.php/Systemd "Systemd"):

 `pmtu-clamping.service` 
```
[Unit]
Description=PMTU clamping for pppoe
Requires=iptables.service
After=iptables.service

[Service]
Type=oneshot
ExecStart=/usr/bin/iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

[Install]
WantedBy=multi-user.target

```

И включите эту службу.

### Не удается загрузить модуль ядра ppp_generic

Проблема выражается в том, что при запуске процесс *pppd* не может найти соответствующий модуль:

```
Couldn't open the /dev/ppp device: No such device or address
Please load the ppp_generic kernel module.

```

Решается исправлением `/etc/modprobe.d/modules.conf`: замените в файле строку

```
alias char-major-108 ppp

```

на

```
alias char-major-108 ppp_generic

```

или добавьте ее, если первой строки в файле не было.

После перезагрузки проблема должна решиться.